home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-02-12 | 26.7 KB | 1,090 lines |
- **********************************************************************
- ** program : ProRunCrack **
- ** version : 1.0 **
- ** author : Gunther Nikl **
- ** language : Devpac 2.14 (assembler) **
- ** bugs : none known **
- **********************************************************************
- ** **
- ** History **
- ** ------- **
- ** v1.0 05-Mar-93 first version **
- ** **
- **********************************************************************
-
- opt o+,w-
-
- _LVOForbid equ -132
- _LVOAllocMem equ -198
- _LVOFreeMem equ -210
- _LVOGetMsg equ -372
- _LVOReplyMsg equ -378
- _LVOWaitPort equ -384
- _LVOCloseLibrary equ -414
- _LVORawDoFmt equ -522
- _LVOOpenLibrary equ -552
-
- _LVOOpen equ -30
- _LVOClose equ -36
- _LVORead equ -42
- _LVOWrite equ -48
- _LVOOutput equ -60
- _LVOSeek equ -66
- _LVODeleteFile equ -72
- _LVOCurrentDir equ -126
-
- _LVOFileRequest equ -84
- _LVOPurgeFiles equ -114
-
- ADDSTR macro
- dc.w \1.str-StringTab
- \1 equ StrCount
- StrCount set \1+1
- endm
-
- bp equr a5
-
- gb_SysBase equ -0 ; L ; destroys original A5 !!!!
- gb_DosBase equ -4 ; L
- gb_ReqBase equ -8 ; L
- gb_WbMsg equ -12 ; L
- gb_StdOut equ -16 ; L
- gb_PattCount equ -17 ; B
- gb_FlagLF equ -18 ; B
- gb_FlagReq equ -19 ; B
- gb_ArgC equ -20 ; B
- gb_ArgV equ -28 ; L*2
- gb_FileSize equ -32 ; L
- gb_FileBuf equ -36 ; L
- gb_ModSize equ -40 ; L
- gb_ModPtr equ -44 ; L
- gb_PtHeadSize equ -48 ; L
- gb_PtHeadBuf equ -52 ; L
- gb_FileReq equ -408 ; B*356
- gb_DirName equ -540 ; B*132
- gb_FileName equ -572 ; B*32
- gb_PrintBuf equ -736 ; B*164
- gb_SIZEOF equ -736
-
- start link bp,#gb_SIZEOF ; Platz fuer Vars schaffen
-
- move.l d0,d2 ; Argumentlaenge sichern
- move.l a0,a2 ; Argumentzeile sichern
-
- move.l #(~gb_SIZEOF>>2),d1
- move.l bp,a1
- .clear clr.l -(a1) ; Variablenbereich loeschen
- dbra d1,.clear
-
- move.l 4.w,a6
- move.l a6,gb_SysBase(bp) ; ExecBase sichern
-
- move.l 276(a6),a4 ; SysBase->ThisTask
-
- move.l 184(a4),d4 ; pr_WindowPtr
- moveq #-1,d0
- move.l d0,184(a4) ; keine DOS-Requester
-
- tst.l 172(a4)
- bne.s fromCLI ; CLI-Start
-
- fromWB lea 92(a4),a0
- jsr _LVOWaitPort(a6)
- lea 92(a4),a0
- jsr _LVOGetMsg(a6)
- move.l d0,gb_WbMsg(bp) ; WB-Message
- bsr OpenDOS
- beq.s exit2 ; kein DOS
- move.l gb_WbMsg(bp),a1
- move.l 36(a1),a1
- move.l (a1),d1
- move.l gb_DosBase(bp),a6
- jsr _LVOCurrentDir(a6) ; aktuelles Directory setzen
- lea ConName.str(pc),a1
- move.l a1,d1
- move.l #1005,d2 ; MODE_OLDFILE
- jsr _LVOOpen(a6)
- move.l d0,160(a4) ; pr_COS -> Window Handle
- beq.s exit2 ; Fehler
- bsr.s main
- moveq #Return,d0 ; "Press RETURN !"
- bsr PrintStr
- move.l 160(a4),d1 ; pr_COS
- lea gb_PrintBuf(bp),a0
- move.l a0,d2
- moveq #1,d3
- move.l gb_DosBase(bp),a6
- jsr _LVORead(a6) ; ein Zeichen lesen
- move.l 160(a4),d1
- jsr _LVOClose(a6) ; Fenster schliessen
- move.l gb_SysBase(bp),a6
- exit2 jsr _LVOForbid(a6)
- move.l gb_WbMsg(bp),a1
- jsr _LVOReplyMsg(a6) ; WB-Message beantworten
- bra.s exit ; zum Hauptprogramm
-
- fromCLI clr.b -1(a2,d2.w) ; Zeile terminieren
- bsr.s OpenDOS
- beq.s exit ; kein DOS
- move.l a2,a1
- lea gb_ArgV(bp),a2
- moveq #0,d2
- bsr BuildArgV ; Argument-Vektor aufbauen
- move.b d2,gb_ArgC(bp) ; Argumentzahl sichern
- bsr.s main ; Hauptprogramm
- exit bsr.s CloseDOS
- move.l d4,184(a4) ; alten WindowPtr setzen
- moveq #0,d0 ; ReturnCode = Alles Ok
- unlk bp ; Stack aufraeumen
- rts
-
- OpenDOS lea DosName(pc),a1 ; dos.library
- moveq #33,d0
- jsr _LVOOpenLibrary(a6) ; DOS oeffen
- move.l d0,gb_DosBase(bp) ; sichern -> Flags stellen
- rts
-
- CloseDOS move.l gb_DosBase(bp),d0 ; DOS geoeffnet ?
- beq.s .quit ; nein
- move.l d0,a1
- jsr _LVOCloseLibrary(a6) ; DOS schliessen
- .quit rts
-
- *****************************************************************************
-
- main move.l a6,-(sp) ; Reg sichern
-
- moveq #PrgName,d0
- bsr PrintStr ; Copyright ausgeben
-
- move.l gb_ArgV(bp),a0 ; 1. Argument
- move.b gb_ArgC(bp),d0 ; Parameter ?
- beq.s m_request2 ; FileRequester bringen
- subq.b #2,d0
- beq.s m_request ; In && Out || DirName sowie
- cmp.b #'?',(a0)
- bne.s m_request ; kein Hilfeersuchen
- m_use moveq #Usage,d0
- bsr PrintStr ; Usage ausgeben
- bra.s m_quit
-
- m_request move.b (a0)+,d0 ; erstes Zeichen
- rol.w #8,d0
- move.b (a0)+,d0 ; zweites Zeichen
- bset #5,d0
- cmp.w #'-d',d0
- bne.s m_loop ; kein Directory
- tst.b (a0)
- bne.s .onlyone ; Name direkt angeschlossen
- move.l gb_ArgV+4(bp),d0
- beq.s m_use ; Fehler -d ohne Argument !
- move.l d0,a0
- .onlyone lea gb_DirName(bp),a1
- moveq #127,d0
- .copy move.b (a0)+,(a1)+ ; DirName kopieren
- dbeq d0,.copy
- m_request2 lea ReqLoad.str(pc),a0
- bsr.s ReqFile ; File waehlen
- bne.s m_quit ; Abbruch oder Fehler
- st gb_FlagReq(bp)
- m_loop bsr LoadFile ; File laden
- bne.s m_cont2 ; Fehler !
- bsr DoMake ; PT-Module aufbauen
- bne.s m_cont ; Fehler !
- tst.b gb_FlagReq(bp)
- beq.s m_save
- lea ReqSave.str(pc),a0
- bsr.s ReqFile ; File waehlen
- bne.s m_cont ; Abbruch oder Fehler
- m_save bsr SaveFile ; File speichern
- m_cont move.l gb_SysBase(bp),a6
- move.l gb_PtHeadBuf(bp),d0
- beq.s m_cont ; kein Puffer da
- move.l d0,a1
- move.l gb_PtHeadSize(bp),d0 ; Puffergroesse
- jsr _LVOFreeMem(a6)
- m_cont2 move.l gb_FileBuf(bp),d0
- beq.s m_quit ; kein Puffer da
- move.l d0,a1
- move.l gb_FileSize(bp),d0 ; Puffergroesse
- jsr _LVOFreeMem(a6) ; Puffer freigeben
- m_quit move.l (sp)+,a6 ; Reg zurueck
- rts ; Auf Wiedersehen !
-
- *****************************************************************************
-
- ReqFile movem.l d2/a2/a6,-(sp) ; Regs sichern
-
- lea gb_FileReq(bp),a2 ; File Requester
- move.l a0,2(a2) ; Requester Titel eintragen
- move.l gb_ReqBase(bp),d0
- bne.s .is_open ; Lib schon geöffnet !
-
- moveq #ReqNeed,d2 ; REQ-Fehler
- lea ReqName(pc),a1
- moveq #0,d0 ; Lib Version
- move.l gb_SysBase(bp),a6
- jsr _LVOOpenLibrary(a6) ; Lib oeffen
- move.l d0,gb_ReqBase(bp)
- beq.s .quit ; kein REQ
-
- lea gb_DirName(bp),a0
- move.l a0,6(a2) ; DirName
- lea gb_FileName(bp),a0
- move.l a0,10(a2) ; FileName
- lea gb_PrintBuf(bp),a0
- move.l a0,14(a2) ; Path & File Name
- move.w #10,22(a2) ; MaxExtSelect
- move.l #4116,30(a2) ; Cache,IBut & Load
- moveq #2,d2
- move.w d2,34(a2) ; DirNameColour
- move.w d2,38(a2) ; DevNameColour
-
- .is_open moveq #SelectErr,d2 ; REQ-Abbruch
- move.l a2,a0
- move.l d0,a6 ; d0 -> ReqBase !!!
- jsr _LVOFileRequest(a6) ; Fragen wat nu ...
- tst.l d0
- beq.s .purge ; nichts ausgewaehlt
- ; move.b #1,gb_ArgC(bp) ; ein Argument
- move.l 14(a2),gb_ArgV(bp) ; load name
- move.l 14(a2),gb_ArgV+4(bp) ; save name
- moveq #0,d2 ; alles ok
-
- .purge move.l d2,d0
- bne.s .purge_ok ; Fehler aufgetreten
- tst.b gb_FlagReq(bp)
- beq.s .quit ; Req noch nicht schliessen
-
- .purge_ok move.l a2,a0 ; dem Request assoziierte
- jsr _LVOPurgeFiles(a6) ; Speicherbereiche freigeben
- move.l a6,a1
- move.l gb_SysBase(bp),a6
- jsr _LVOCloseLibrary(a6) ; REQ schliessen
-
- .quit move.l d2,d0 ; Fehler aufgetreten
- beq.s .quit2
- lea ReqName(pc),a1
- bsr PrintStr ; Meldung ausgeben
- move.l d2,d0 ; Flags wieder stellen
-
- .quit2 movem.l (sp)+,d2/a2/a6 ; Regs zurueck
- rts
-
- *****************************************************************************
-
- LoadFile movem.l d2-7/a2/a6,-(sp) ; Regs sichern
-
- move.l gb_ArgV(bp),a0
- bsr ExtractRealName ; Pfad und/oder Dir entfernen
-
- lea gb_PrintBuf(bp),a2 ; hier jetzt voller DateiName
- move.l gb_DosBase(bp),a6
-
- moveq #FileErr,d7 ; File-Fehler
- move.l a2,d1
- move.l #1005,d2
- jsr _LVOOpen(a6) ; Datei öffnen
- move.l d0,d4
- beq .quit2 ; File nicht gefunden
-
- moveq #ReadErr,d7 ; Lesefehler
- move.l d4,d1
- move.l a2,d2
- moveq #8,d3
- jsr _LVORead(a6) ; erste 8 Bytes lesen
- cmp.l d0,d3
- bne .closef ; Lesefehler
- move.l (a2),d6 ; erste 4 Bytes der Datei
-
- move.l d4,d1
- moveq #-4,d2
- moveq #1,d3 ; OFFSET_END
- jsr _LVOSeek(a6) ; zum Dateiende-4
- tst.l d0
- bmi.s .closef ; Seekfehler
-
- move.l d4,d1
- move.l a2,d2
- moveq #4,d3
- jsr _LVORead(a6) ; 4 Bytes lesen
- cmp.l d0,d3
- bne.s .closef ; Lesefehler
-
- move.l d4,d1
- moveq #0,d2
- moveq #-1,d3 ; OFFSET_BEGINNING
- jsr _LVOSeek(a6) ; zum Dateianfang
- move.l d0,d3 ; Wert sichern
- bmi.s .closef ; Seekfehler
- move.l d3,gb_ModSize(bp)
-
- exg.l d2,d6 ; Null nach D6
- cmp.l #'PP20',d2 ; PowerPacked ?
- bne.s .notpp
- move.l (a2),d6 ; richtige Laenge
- lsr.l #8,d6 ; extrahieren
- move.l d6,gb_ModSize(bp)
- moveq #16,d0 ; 16 Bytes als
- add.l d0,d6 ; Sicherheit dazu
- .notpp exg.l d3,d6
- tst.l d3
- bne.s .ok ; D6 <> 0 -> gepacket !
- exg.l d3,d6 ; Abstand zurueck nach d0
- bsr.s ModCheck ; Modul prüfen
- bne.s .closef ; nein
- .ok move.l d3,gb_FileSize(bp) ; Puffergroesse
-
- moveq #MemErr,d7 ; Speicher-Fehler
- move.l d3,d0 ; Speichergroesse
- moveq #1,d1
- move.l gb_SysBase(bp),a6
- jsr _LVOAllocMem(a6) ; Puffer allokieren
- move.l gb_DosBase(bp),a6
- move.l d0,gb_FileBuf(bp)
- beq.s .closef ; kein Speicher
- move.l d0,gb_ModPtr(bp) ; if PP -> FileBuf != ModPtr !
-
- moveq #ReadErr,d7 ; Lese-Fehler
- move.l d4,d1
- move.l gb_FileBuf(bp),d2
- tst.l d6 ; gepackte Laenge != 0 ?
- beq.s .read
- move.l d6,d3 ; powerpacked
- .read jsr _LVORead(a6) ; Header & Pattern einlesen
- cmp.l d0,d3
- bne.s .closef ; Lesefehler
- moveq #0,d7 ; kein Fehler
-
- .closef move.l d4,d1
- jsr _LVOClose(a6) ; File schliessen
-
- .quitt tst.l d6 ; gepackt ?
- beq.s .quit2
- move.l gb_FileBuf(bp),a1 ; DeCrunch Puffer
- lea 0(a1,d6.l),a0 ; EndCrunch
- lea 16(a1),a1
- move.l a1,gb_ModPtr(bp) ; richtiger Module-Ptr
- addq.l #4,a2 ; DeCrunch-Bits
- bsr PPDeCrunch ; auspacken
- move.l (a1),d2
- bsr.s ModCheck ; prüfen
-
- .quit2 move.l d7,d0 ; alles ok ?
- beq.s .quit3 ; ja
- lea gb_FileName(bp),a1 ; FileName
- bsr PrintStr ; Fehler-Meldung ausgeben
- move.l d7,d0 ; Fehler-Nr zurueckgeben
-
- .quit3 movem.l (sp)+,d2-7/a2/a6 ; Regs zurueck
- rts
-
- ModCheck moveq #0,d7
- cmp.l #'SNT!',d2 ; Kennung
- beq.s .quit
- moveq #ModErr,d7
- .quit rts
-
- *****************************************************************************
-
- ExtractRealName lea gb_PrintBuf(bp),a1 ; open buffer
- move.w #163,d0
- .copy1 move.b (a0)+,(a1)+ ; copy argument
- dbeq d0,.copy1
- lea gb_PrintBuf(bp),a0 ; string to parse
- move.l a0,a1
- moveq #-1,d1
- .strlen tst.b (a1)+ ; look for string end
- dbeq d1,.strlen
- not.l d1 ; string len of filename
- .search1 move.b (a0,d1.w),d0 ; search for "/" && ":" to
- cmp.b #'/',d0
- beq.s .next1 ; eliminate path and/or
- cmp.b #':',d0
- .next1 dbeq d1,.search1 ; dir from file name
- lea 1(a0,d1.w),a0 ; start of real name
- lea gb_FileName(bp),a1 ; real name buffer
- moveq #29,d0
- .copy2 move.b (a0)+,(a1)+ ; copy name
- dbeq d0,.copy2
- lea gb_FileName(bp),a1 ; check the filename
- .search2 move.b (a1)+,d1
- beq.s .ok ; for '.pp' extension
- cmp.b #'.',d1
- bne.s .search2
- move.b (a1),d1 ; if this extension is
- rol.w #8,d1
- move.b 1(a1),d1
- or.w #$2020,d1 ; found then remove
- cmp.w #'pp',d1
- bne.s .search2
- tst.b 2(a1) ; string end ?
- bne.s .search2
- clr.b -1(a1) ; it !
- .ok rts
-
- *****************************************************************************
-
- SaveFile movem.l d2-5/a6,-(sp) ; save regs
-
- move.l gb_ArgV+4(bp),d0 ; second argument ?
- bne.s .is_name
- move.l gb_ArgV(bp),d0 ; use first argument
- .is_name move.l d0,a0
- bsr.s ExtractRealName ; remove path and/or dir
-
- move.l gb_DosBase(bp),a6
-
- moveq #FileErr,d5
- lea gb_PrintBuf(bp),a1 ; here is the full filename
- move.l a1,d1
- move.l #1006,d2 ; MODE_NEWFILE
- jsr _LVOOpen(a6)
- move.l d0,d4
- beq.s .quit ; open error
-
- moveq #WriteErr,d5
- move.l d4,d1
- move.l gb_PtHeadBuf(bp),d2 ; pt header
- move.l gb_PtHeadSize(bp),d3 ; header size
- jsr _LVOWrite(a6)
- cmp.l d3,d0
- bne.s .closef ; write error
-
- move.l d4,d1
- move.l gb_ModPtr(bp),a0
- move.l a0,d2
- add.l 4(a0),d2 ; sample start
- move.l a0,d3
- add.l gb_ModSize(bp),d3
- sub.l d2,d3 ; sample length
- jsr _LVOWrite(a6)
- cmp.l d3,d0
- bne.s .closef ; write error
- moveq #0,d5 ; all ok
-
- .closef move.l d4,d1
- jsr _LVOClose(a6) ; close file
- move.l d5,d0
- beq.s .quit
- .delfile lea gb_PrintBuf(bp),a1
- move.l a1,d1
- jsr _LVODeleteFile(a6) ; remove faulty file
-
- .quit move.l d5,d0 ; error ?
- bne.s .msg
- moveq #Success,d0 ; end message
- .msg lea gb_FileName(bp),a1
- bsr PrintStr ; print err message
- move.l d5,d0
-
- .quit2 movem.l (sp)+,d2-5/a6 ; restore regs
- rts
-
- *****************************************************************************
-
- DoMake movem.l d2/a6,-(sp) ; save regs
- moveq #0,d0
- moveq #0,d1
- move.l gb_ModPtr(bp),a1
- lea $102(a1),a1 ; start of pattern list
- moveq #127,d2 ; 128 entrys
- .look move.b (a1)+,d1
- cmp.b d0,d1
- bcs.s .next
- move.b d1,d0
- .next dbra d2,.look
- move.b d0,gb_PattCount(bp) ; highest pattern in file
- addq.w #1,d0
- lsl.l #8,d0
- lsl.l #2,d0 ; pattcount*1024
- add.l #$43c,d0 ; add header size
- move.l d0,gb_PtHeadSize(bp)
- moveq #1,d1
- swap d1
- move.l gb_SysBase(bp),a6
- jsr _LVOAllocMem(a6)
- moveq #MemErr,d2
- move.l d0,gb_PtHeadBuf(bp)
- beq.s .quit ; no buffer
-
- moveq #InfoPR,d0 ; ProRunner Info
- lea gb_FileName(bp),a1
- bsr.s PrintStr ; Name
- moveq #InfoFS,d0
- move.l gb_ModSize(bp),a1
- bsr.s PrintStr ; Size
-
- bsr BuildHeader ; build pt header
- bsr MakePattern ; construct pattern
-
- moveq #InfoPT,d0 ; ProTracker Info
- lea gb_FileName(bp),a1
- bsr.s PrintStr ; Name
- moveq #InfoFS,d0
- move.l gb_ModPtr(bp),a0 ; calculate sample length
- move.l gb_ModSize(bp),a1
- sub.l 4(a0),a1
- add.l gb_PtHeadSize(bp),a1
- bsr.s PrintStr ; Size
- st gb_FlagLF(bp) ; naechstes PrintStr, erst LF
- moveq #0,d2 ; all ok
-
- .quit move.l d2,d0
- beq.s .quit2
- bsr.s PrintStr ; error message
- move.l d2,d0
- .quit2 movem.l (sp)+,d2/a6 ; restore regs
- rts
-
- *****************************************************************************
-
- PrintStr movem.l d2-3/a1-3/a6,-(sp) ; save regs
- move.l d0,d2
- tst.b gb_FlagLF(bp)
- beq.s .nolf
- clr.b gb_FlagLF(bp)
- moveq #LineFeed,d0
- bsr.s PrintStr
- .nolf lea StringTab(pc),a0 ; start of string table
- add.w d2,d2
- add.w 0(a0,d2.w),a0 ; add offset
- move.l a1,-(sp)
- move.l sp,a1 ; pointer to argument
- lea sc_put(pc),a2 ; buffer function
- lea gb_PrintBuf(bp),a3 ; output buffer
- move.l gb_SysBase(bp),a6
- jsr _LVORawDoFmt(a6) ; do the format
- addq.l #4,sp ; adjust stack
- move.l gb_DosBase(bp),a6
- jsr _LVOOutput(a6)
- lea gb_PrintBuf(bp),a0
- move.l a0,d2 ; output buffer
- moveq #-1,d3
- .size tst.b (a0)+
- dbeq d3,.size
- not.l d3 ; output lenght
- jsr _LVOWrite(a6)
- movem.l (sp)+,d2-3/a1-3/a6 ; restore regs
- rts
-
- sc_put move.b d0,(a3)+ ; store char in buffer
- rts
-
- *****************************************************************************
-
- BuildHeader lea gb_FileName(bp),a0 ; name without path && dir
- move.l gb_PtHeadBuf(bp),a1
- moveq #19,d0
- .copy1 move.b (a0)+,(a1)+ ; copy name to pt mod
- dbeq d0,.copy1
- move.l gb_ModPtr(bp),a0 ; ProRun Mod
- addq.l #8,a0
- move.l gb_PtHeadBuf(bp),a1 ; ProTr Mod
- lea 20(a1),a1
- moveq #30,d0 ; copy 31 sample infos
- .copy2 lea 22(a1),a1
- move.l (a0)+,(a1)+ ; lenght, fintune & volume
- move.l (a0)+,(a1)+ ; repstart, replength
- dbra d0,.copy2
- moveq #31,d0
- .copy3 move.l (a0)+,(a1)+ ; copy pattern list
- dbra d0,.copy3
- move.w (a0)+,(a1)+
- move.l #'M.K.',(a1) ; store pt sign
- rts
-
- MakePattern movem.l d2-6/a2-3,-(sp) ; save regs
- moveq #12,d3
- move.l gb_ModPtr(bp),a0
- lea $302(a0),a0 ; pattern start prorun
- move.l gb_PtHeadBuf(bp),a1
- lea $43c(a1),a1 ; pattern start protr
- lea pt_periods(pc),a2
- lea gb_PrintBuf(bp),a3 ; temp note buffer
- moveq #0,d6
- move.b gb_PattCount(bp),d6
- nextpatt move.w #255,d5 ; 256 notes
- nextnote moveq #0,d0
- move.b (a0)+,d0 ; pos+0
- .fall3 move.l 0(a3,d3.w),d1
- cmp.b #$c0,d0 ; previous channel note ?
- beq.s savenote
- .fall2 moveq #0,d1
- cmp.b #$80,d0 ; blank note ?
- beq.s savenote
- .fall1 move.b (a0)+,d1 ; pos+1
- moveq #$0f,d2
- and.b d1,d2 ; extract effect number
- lsr.b #4,d1 ; sample nr lower nibble
- add.b d1,d1 ; sample nr * 2
- moveq #1,d4 ; adjust value
- and.b d0,d4 ; check bit zero
- add.b d4,d1 ; adjust sample nr
- sub.b d4,d0 ; adjust note offset
- beq.s .no_per ; period == 0
- move.w -2(a2,d0.w),d0 ; get period
- .no_per swap d1
- lsr.l #4,d1 ; divide sample nr
- lsl.w #8,d2 ; enable effect parameter
- move.b (a0)+,d2 ; pos+2
- or.w d2,d1 ; make lower part
- swap d1
- ror.w #4,d1 ; move upper sample nr bits
- or.w d0,d1 ; make upper part
- swap d1
- savenote move.l d1,(a1)+ ; store full note
- beq.s .no_note
- move.l d1,0(a3,d3.w) ; save new channel note
- .no_note subq.w #4,d3
- bcc.s .next
- moveq #12,d3
- .next dbra d5,nextnote ; next note
- dbra d6,nextpatt ; next pattern
- movem.l (sp)+,d2-6/a2-3 ; restore regs
- rts
-
- *****************************************************************************
-
- ; a1 - pointer into command line
- ; d2 - argc
- ; a2 - argv
-
- BuildArgV bsr.s GetNext ; search argument
- bmi.s doquote ; quotation sign
- beq.s dosemi ; commentary stops all
- bcs.s BuildArgV ; separation sign
- lea -1(a1),a0 ; argument start
- bsr.s BumpArgV ; argc+1 & ptr to argv
- build_2 bsr.s GetNext ; search separation sign
- beq.s dosemi ; commentary stops all
- bcc.s build_2 ; no separation sign
- clr.b -1(a1) ; mark end
- bra.s BuildArgV ; continue search
-
- doquote move.l a1,a0 ; argument start
- bsr.s BumpArgV ; argc+1 & ptr to argv
- quote_2 bsr.s GetNext ; search quotation sign
- bpl.s quote_2 ; no quotation sign
- clr.b -1(a1) ; mark end
- quote_3 bsr.s GetNext ; search sepaartion sign
- beq.s dosemi ; commentary stops all
- bcc.s quote_3 ; no separation sign
- bra.s BuildArgV ; continue search
-
- dosemi clr.b -(a1) ; delete semicolon
- bra.s BuildArgV ; go on
-
- BumpArgV cmp.w #2,d2 ; max argc reached ?
- bcc.s .full
- move.l a0,(a2)+ ; store argptr
- addq.w #1,d2 ; increment argc
- .full rts
-
- GetNext move.b (a1)+,d0 ; test character
- beq.s BuildRdy
- moveq #-3,d1 ; N=1,Z=0,C=0 -> quotation
- cmp.b #'"',d0
- beq.s .quit
- moveq #-2,d1 ; N=0,Z=1,C=1 -> semicolon
- cmp.b #';',d0
- beq.s .quit
- moveq #-1,d1 ; N=0,Z=0,C=1 -> separation
- cmp.b #'=',d0
- beq.s .quit
- cmp.b #' ',d0
- beq.s .quit
- cmp.b #9,d0
- beq.s .quit
- moveq #0,d1 ; N=0,Z=0,C=0 -> others
- .quit addq.l #2,d1 ; set flags ( see above )
- rts
-
- BuildRdy addq.l #4,sp ; set right return address
- rts
-
- *****************************************************************************
-
- ; PowerPacker assembler decrunch-subroutine
- ;
- ; PPDecrunch (endcrun, buffer, efficiency);
- ; a0 a1 a2
-
- PPDeCrunch movem.l d0-7/a0-5,-(sp)
- moveq #0,d4
- moveq #1,d5
- moveq #24,d6
- move.w #255,d7
- movea.l a1,a3
- lea myDecrTab(pc),a4
- lea $dff1a2,a5 ; DeCrunch Effect
- move.l -(a0),d1
- tst.b d1
- beq.s ppdecr_02
- lsr.l #1,d5
- beq.s ppdecr_10
- ppdecr_01 subq.b #1,d1
- lsr.l d1,d5
- ppdecr_02 lsr.l #8,d1
- adda.l d1,a1
- ppdecr_03 lsr.l #1,d5
- beq.s ppdecr_11
- ppdecr_04 bcs ppdecr_21
- moveq #0,d2
- ppdecr_05 moveq #0,d1
- lsr.l #1,d5
- beq.s ppdecr_12
- ppdecr_06 roxl.w #1,d1
- lsr.l #1,d5
- beq.s ppdecr_13
- ppdecr_07 roxl.w #1,d1
- add.w d1,d2
- subq.w #3,d1
- beq.s ppdecr_05
- moveq #0,d0
- ppdecr_08 move.b d5,d4
- lsr.l #8,d5
- beq.s ppdecr_16
- ppdecr_09 move.b -128(a4,d4.w),d0
- move.b d0,-(a1)
- dbra d2,ppdecr_08
- move.w a1,(a5)
- cmpa.l a1,a3
- bcs.s ppdecr_21
- bra ppdecr_52
-
- ppdecr_10 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_01
-
- ppdecr_11 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_04
-
- ppdecr_12 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_06
-
- ppdecr_13 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_07
-
- ppdecr_14 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_22
-
- ppdecr_15 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_23
-
- ppdecr_16 move.b 127(a4,d4.w),d0
- move.l -(a0),d5
- move.w d5,d3
- lsl.w d0,d3
- bchg d0,d3
- eor.w d3,d4
- and.w d7,d4
- moveq #8,d1
- sub.w d0,d1
- lsr.l d1,d5
- add.w d6,d0
- bset d0,d5
- bra.s ppdecr_09
-
- ppdecr_17 move.b 127(a4,d4.w),d0
- move.l -(a0),d5
- move.w d5,d3
- lsl.w d0,d3
- bchg d0,d3
- eor.w d3,d4
- and.w d7,d4
- moveq #8,d1
- sub.w d0,d1
- lsr.l d1,d5
- add.w d6,d0
- bset d0,d5
- bra.s ppdecr_24
-
- ppdecr_18 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_30
-
- ppdecr_19 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_31
-
- ppdecr_20 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_32
-
- ppdecr_21 moveq #0,d2
- lsr.l #1,d5
- beq.s ppdecr_14
- ppdecr_22 roxl.w #1,d2
- lsr.l #1,d5
- beq.s ppdecr_15
- ppdecr_23 roxl.w #1,d2
- move.b d5,d4
- lsr.l #8,d5
- beq.s ppdecr_17
- ppdecr_24 moveq #0,d3
- move.b -128(a4,d4.w),d3
- cmp.w #3,d2
- bne.s ppdecr_43
- bclr #7,d3
- beq.s ppdecr_36
- moveq #13,d0
- sub.b 0(a2,d2.w),d0
- move.w d0,d1
- add.w d0,d0
- add.w d1,d0
- add.w d0,d0
- jmp ppdecr_28(pc,d0.w)
-
- ppdecr_25 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_33
-
- ppdecr_26 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_34
-
- ppdecr_27 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_35
-
- ppdecr_28 lsr.l #1,d5
- beq.s ppdecr_18
- ppdecr_30 roxl.w #1,d3
- lsr.l #1,d5
- beq.s ppdecr_19
- ppdecr_31 roxl.w #1,d3
- lsr.l #1,d5
- beq.s ppdecr_20
- ppdecr_32 roxl.w #1,d3
- lsr.l #1,d5
- beq.s ppdecr_25
- ppdecr_33 roxl.w #1,d3
- lsr.l #1,d5
- beq.s ppdecr_26
- ppdecr_34 roxl.w #1,d3
- lsr.l #1,d5
- beq.s ppdecr_27
- ppdecr_35 roxl.w #1,d3
- ppdecr_36 moveq #0,d1
- lsr.l #1,d5
- beq.s ppdecr_40
- ppdecr_37 roxl.w #1,d1
- lsr.l #1,d5
- beq.s ppdecr_41
- ppdecr_38 roxl.w #1,d1
- lsr.l #1,d5
- beq.s ppdecr_42
- ppdecr_39 roxl.w #1,d1
- add.w d1,d2
- subq.w #7,d1
- beq.s ppdecr_36
- bra.s ppdecr_50
-
- ppdecr_40 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_37
-
- ppdecr_41 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_38
-
- ppdecr_42 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_39
-
- ppdecr_43 moveq #13,d0
- sub.b 0(a2,d2.w),d0
- move.w d0,d1
- add.w d0,d0
- add.w d1,d0
- add.w d0,d0
- jmp ppdecr_44(pc,d0.w)
-
- ppdecr_44 lsr.l #1,d5
- beq.s ppdecr_53
- ppdecr_45 roxl.w #1,d3
- lsr.l #1,d5
- beq.s ppdecr_54
- ppdecr_46 roxl.w #1,d3
- lsr.l #1,d5
- beq.s ppdecr_55
- ppdecr_47 roxl.w #1,d3
- lsr.l #1,d5
- beq.s ppdecr_56
- ppdecr_48 roxl.w #1,d3
- lsr.l #1,d5
- beq.s ppdecr_57
- ppdecr_49 roxl.w #1,d3
- ppdecr_50 move.b 0(a1,d3.w),-(a1)
- ppdecr_51 move.b 0(a1,d3.w),-(a1)
- dbra d2,ppdecr_51
- move.w a1,(a5)
- cmpa.l a1,a3
- bcs ppdecr_03
- ppdecr_52 movem.l (sp)+,d0-7/a0-5
- rts
-
- ppdecr_53 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_45
-
- ppdecr_54 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_46
-
- ppdecr_55 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_47
-
- ppdecr_56 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_48
-
- ppdecr_57 move.l -(a0),d5
- roxr.l #1,d5
- bra.s ppdecr_49
-
- dc.b $00,$80,$40,$C0,$20,$A0,$60,$E0
- dc.b $10,$90,$50,$D0,$30,$B0,$70,$F0
- dc.b $08,$88,$48,$C8,$28,$A8,$68,$E8
- dc.b $18,$98,$58,$D8,$38,$B8,$78,$F8
- dc.b $04,$84,$44,$C4,$24,$A4,$64,$E4
- dc.b $14,$94,$54,$D4,$34,$B4,$74,$F4
- dc.b $0C,$8C,$4C,$CC,$2C,$AC,$6C,$EC
- dc.b $1C,$9C,$5C,$DC,$3C,$BC,$7C,$FC
- dc.b $02,$82,$42,$C2,$22,$A2,$62,$E2
- dc.b $12,$92,$52,$D2,$32,$B2,$72,$F2
- dc.b $0A,$8A,$4A,$CA,$2A,$AA,$6A,$EA
- dc.b $1A,$9A,$5A,$DA,$3A,$BA,$7A,$FA
- dc.b $06,$86,$46,$C6,$26,$A6,$66,$E6
- dc.b $16,$96,$56,$D6,$36,$B6,$76,$F6
- dc.b $0E,$8E,$4E,$CE,$2E,$AE,$6E,$EE
- dc.b $1E,$9E,$5E,$DE,$3E,$BE,$7E,$FE
- myDecrTab dc.b $01,$81,$41,$C1,$21,$A1,$61,$E1
- dc.b $11,$91,$51,$D1,$31,$B1,$71,$F1
- dc.b $09,$89,$49,$C9,$29,$A9,$69,$E9
- dc.b $19,$99,$59,$D9,$39,$B9,$79,$F9
- dc.b $05,$85,$45,$C5,$25,$A5,$65,$E5
- dc.b $15,$95,$55,$D5,$35,$B5,$75,$F5
- dc.b $0D,$8D,$4D,$CD,$2D,$AD,$6D,$ED
- dc.b $1D,$9D,$5D,$DD,$3D,$BD,$7D,$FD
- dc.b $03,$83,$43,$C3,$23,$A3,$63,$E3
- dc.b $13,$93,$53,$D3,$33,$B3,$73,$F3
- dc.b $0B,$8B,$4B,$CB,$2B,$AB,$6B,$EB
- dc.b $1B,$9B,$5B,$DB,$3B,$BB,$7B,$FB
- dc.b $07,$87,$47,$C7,$27,$A7,$67,$E7
- dc.b $17,$97,$57,$D7,$37,$B7,$77,$F7
- dc.b $0F,$8F,$4F,$CF,$2F,$AF,$6F,$EF
- dc.b $1F,$9F,$5F,$DF,$3F,$BF,$7F,$FF
- dc.b $00,$01,$01,$02,$02,$02,$02,$03
- dc.b $03,$03,$03,$03,$03,$03,$03,$04
- dc.b $04,$04,$04,$04,$04,$04,$04,$04
- dc.b $04,$04,$04,$04,$04,$04,$04,$05
- dc.b $05,$05,$05,$05,$05,$05,$05,$05
- dc.b $05,$05,$05,$05,$05,$05,$05,$05
- dc.b $05,$05,$05,$05,$05,$05,$05,$05
- dc.b $05,$05,$05,$05,$05,$05,$05,$06
- dc.b $06,$06,$06,$06,$06,$06,$06,$06
- dc.b $06,$06,$06,$06,$06,$06,$06,$06
- dc.b $06,$06,$06,$06,$06,$06,$06,$06
- dc.b $06,$06,$06,$06,$06,$06,$06,$06
- dc.b $06,$06,$06,$06,$06,$06,$06,$06
- dc.b $06,$06,$06,$06,$06,$06,$06,$06
- dc.b $06,$06,$06,$06,$06,$06,$06,$06
- dc.b $06,$06,$06,$06,$06,$06,$06,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$07
- dc.b $07,$07,$07,$07,$07,$07,$07,$00
-
- *****************************************************************************
-
- pt_periods dc.w 856,808,762,720,678,640,604,570,538
- dc.w 508,480,453,428,404,381,360,339,320
- dc.w 302,285,269,254,240,226,214,202,190
- dc.w 180,170,160,151,143,135,127,120,113
-
- StrCount set 0
-
- StringTab ADDSTR PrgName
- ADDSTR Usage
- ADDSTR FileErr
- ADDSTR ReadErr
- ADDSTR WriteErr
- ADDSTR ModErr
- ADDSTR MemErr
- ADDSTR ReqNeed
- ADDSTR SelectErr
- ADDSTR InfoPR
- ADDSTR InfoPT
- ADDSTR InfoFS
- ADDSTR LineFeed
- ADDSTR Success
- ADDSTR Return
-
- PrgName.str dc.b $9B,'3;33mProRunCrack 1.0',$9b,'0m © 1993'
- dc.b ' by Gunther Nikl',10,10,0
- even
- Usage.str dc.b $9B,'1;31mUsage:',$9b,'0m ProRunCrack '
- dc.b '[ InFile ] [ OutFile ]',10
- dc.b ' or',10,' ProRunCrack '
- dc.b '[ -d DirectoryName ]',10,0
- even
- FileErr.str dc.b '%s - open error !',10,0
- even
- ReadErr.str dc.b '%s - read error !',10,0
- even
- WriteErr.str dc.b '%s - write error !',10,0
- even
- ModErr.str dc.b '%s - not a prorunner 2.0 module !',10,0
- even
- MemErr.str dc.b 'not enough memory !',10,0
- even
- ReqNeed.str dc.b 'no %s for filerequest !',10,0
- even
- SelectErr.str dc.b 'requester canceled !',10,0
- even
- InfoPR.str dc.b 'ProRunner : %s',0
- even
- InfoPT.str dc.b 'ProTracker : %s',0
- even
- InfoFS.str dc.b ' -> %6ld Bytes'
- LineFeed.str dc.b 10,0
- even
- Success.str dc.b 'done.',10,0
- even
- Return.str dc.b 10,$9B,'0 p',$9B,'3;31mANY KEY TO QUIT !',$9b,'0m',0
- even
-
- ReqLoad.str dc.b 'Load ProRunner File ...',0
- even
- ReqSave.str dc.b 'Save ProTracker File to ...',0
- even
-
- ConName.str dc.b 'RAW:0/20/640/100/ProRunCrack 1.0',0
- even
-
- DosName dc.b 'dos.library',0
- even
- ReqName dc.b 'req.library',0
- even
-
-